#!/bin/bash

# 该脚本在编译前执行
# 功能：
# 1. 每隔60天更新一次 geoip-lite 的 IP 数据库;需要提前在官网注册并获取 license_key
#    

# 配置部分
TIMESTAMP_FILE=".last_geoip_timestamp" # 创建发这个文件,而没有往package.json中增加字段,是考虑到文件合并可能遇到冲突问题
GEOIP_LITE_DIR="node_modules/geoip-lite"
LICENSE_KEY="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"  # 请替换为您自己的 license_key
UPDATE_INTERVAL_DAYS=60
UPDATE_INTERVAL_SECONDS=$((UPDATE_INTERVAL_DAYS * 24 * 60 * 60))  # 60天的秒数

# 日志函数
log_info() {
    echo "[INFO] $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo "[ERROR] $(date '+%Y-%m-%d %H:%M:%S') - $1" >&2
}

# 1. 获取上次执行时间戳的文件路径
# 1.1 如果文件不存在，创建并初始化为当前时间，并执行更新
if [ ! -f "$TIMESTAMP_FILE" ]; then
    log_info "时间戳文件不存在，创建并初始化为当前时间，并开始更新 geoip-lite 的 IP 数据库。"
    CURRENT_TIMESTAMP=$(date +%s)
    
    # 检查 geoip-lite 目录是否存在
    if [ -d "$GEOIP_LITE_DIR" ]; then
        # 进入 geoip-lite 目录
        cd "$GEOIP_LITE_DIR" || { log_error "无法进入目录 '$GEOIP_LITE_DIR'。"; exit 1; }

        # 执行更新命令
        if npm run-script updatedb license_key="$LICENSE_KEY"; then
            log_info "geoip-lite 的 IP 数据库已成功更新。"
        else
            log_error "更新 geoip-lite 的 IP 数据库失败。"
            cd - >/dev/null 2>&1
            exit 1
        fi

        # 返回根目录
        cd - >/dev/null 2>&1
        log_info "已回到根目录。"
    else
        log_error "当前目录下不存在子目录 '$GEOIP_LITE_DIR'。"
        exit 1
    fi

    # 更新时间戳文件
    echo "$CURRENT_TIMESTAMP" > "$TIMESTAMP_FILE"
    log_info "时间戳文件已创建并更新。"
    exit 0
fi

# 1.2 获取当前时间戳
CURRENT_TIMESTAMP=$(date +%s)

# 1.3 读取上次执行时间戳
if ! LAST_TIMESTAMP=$(<"$TIMESTAMP_FILE"); then
    log_error "无法读取时间戳文件 '$TIMESTAMP_FILE'。"
    exit 1
fi

# 1.4 验证上次时间戳是否为有效数字
if ! [[ "$LAST_TIMESTAMP" =~ ^[0-9]+$ ]]; then
    log_error "时间戳文件 '$TIMESTAMP_FILE' 内容无效。"
    exit 1
fi

# 1.5 计算时间差（以秒为单位）
TIME_DIFF=$((CURRENT_TIMESTAMP - LAST_TIMESTAMP))

# 1.6 如果时间差大于等于 60 天，执行更新命令并更新时间戳
if [ "$TIME_DIFF" -ge "$UPDATE_INTERVAL_SECONDS" ]; then
    log_info "已超过 $UPDATE_INTERVAL_DAYS 天，开始更新 geoip-lite 的 IP 数据库。"

    # 检查 geoip-lite 目录是否存在
    if [ -d "$GEOIP_LITE_DIR" ]; then
        # 进入 geoip-lite 目录
        cd "$GEOIP_LITE_DIR" || { log_error "无法进入目录 '$GEOIP_LITE_DIR'。"; exit 1; }

        # 执行更新命令
        if npm run-script updatedb license_key="$LICENSE_KEY"; then
            log_info "geoip-lite 的 IP 数据库已成功更新。"
        else
            log_error "更新 geoip-lite 的 IP 数据库失败。"
            cd - >/dev/null 2>&1
            exit 1
        fi

        # 返回根目录
        cd - >/dev/null 2>&1
        log_info "已回到根目录。"
    else
        log_error "当前目录下不存在子目录 '$GEOIP_LITE_DIR'。"
        exit 1
    fi

    # 更新时间戳文件
    echo "$CURRENT_TIMESTAMP" > "$TIMESTAMP_FILE"
    log_info "时间戳文件已更新。"
else
    REMAINING_SECONDS=$((UPDATE_INTERVAL_SECONDS - TIME_DIFF))
    REMAINING_DAYS=$((REMAINING_SECONDS / 86400))
    log_info "geoip-lite 未到设定的更新时间间隔。剩余 $REMAINING_DAYS 天。"
fi
